<template>
<div >
  <div style="display: flex;">
    <div >
      <JButton size="large" @click="startTask" type="info">启动任务</JButton>
      <JButton size="large" @click="getList"   >刷新任务</JButton>
      <JButton size="large" @click="startSign" >启动签收</JButton>
      <JButton size="large" @click="set" v-if="task==='auto'" >配置</JButton>
      <JButton size="large" @click="showHelp=true"   >说明</JButton>
      <span style="width: 20px;display: inline-block;"></span>
      <div style="display: inline-block;margin-left: 20px;color: white;background: orange;padding: 3px 10px;" v-show="infoMsg!==''">
        {{infoMsg}}
      </div>
      <div style="height: 10px;"></div>
      <JGrid ref="jgridRef" show-footer :columns="columns"  :offset-bottom="10" :offset-width="300"></JGrid>
    </div>

    <div style="width: 295px;">
      <fieldset style="border-color: #2b85e4;">
        <legend><h3 style="color: #01aaee;">运行日志</h3></legend>

        <div style="height: calc(100vh - 120px);overflow: auto;margin-top: 10px;">
          <div v-for="(log, index) in logList" :key="index" :class="[log.stat]">
            {{log.ctime.substr(11)}}【{{log.msg}}】
          </div>
        </div>
      </fieldset>
    </div>
  </div>
</div>
  <tiny-dialog-box v-model:visible="showHelp">
    <h3>1、启动签收 只会 打印、审核、未完成的票据，签收今天以前票据，不会开票</h3><br />
    <h3>2、启动任务，会先开票，然后 打印，审核，签收今天以前票据</h3><br />
    <br /><br /><br /><br />
  </tiny-dialog-box>
  <tiny-dialog-box v-model:visible="showSet" width="1200px">
    <div class="sets">
      <table>
        <tbody>
        <tr>
          <td>数量波动系数</td>
          <td>
            <JInput placeholder="最小波动" v-model="model.dayMin"></JInput>
          </td>
          <td>
            -
          </td>
          <td>
            <JInput placeholder="最大波动" v-model="model.dayMax"></JInput>
          </td>
          <td>(推荐 0.8  ~  1.2) 每天出库数据的均值 *系数=当天出库数量</td>
        </tr>
        <tr>
          <td>每单数量区间</td>
          <td>
            <JInput placeholder="最小" v-model="model.billMin"></JInput>
          </td>
          <td>
            -
          </td>
          <td>
            <JInput placeholder="最大" v-model="model.billMax"></JInput>
          </td>
          <td>(如 2~30 表示最小2件最大30件 每单)</td>
        </tr>
        <tr>
          <td>某商品某终端间隔拿货天数</td>
          <td>
            <JInput placeholder="" v-model="model.gutDays"></JInput>
          </td>
          <td colspan="3">(表示同一商品同一终端间隔 至少 多少天)</td>
        </tr>
        </tbody>
      </table>
      <div style="text-align: center;padding: 20px;">
        <JButton @click="saveSets" size="large" type="info">保存</JButton>
      </div>
      <div style="background: #01aaee;color: white;padding: 10px;">
        <pre>
1、任务样例

开始日期           结束日期           终端编码    终端名称    商品编码   商品名称    到通用的数量     到现饮的数量    到非现饮的数量   到赠送的数量   备注
2025-01-10    2025-01-20                                          xx              yy              300



生成规则：

一、生成数量

1、时间天数    结束日期 - 当天日期（2025-01-11）= 9+1=10天
2、假设还余下的  到通用的数量为     =  200
3、那么 每天平均要出库的数量 =  200 / 10 = 20
4、平均每天波动系数（可配置） = （0.8  ~  1.2) 随机产生  比如当前产生  1.12222
5、那么当天出库数量  = 20 * 1.12222 = 24.4444   向上取整 = 25

二、生成要出库的任务（不包括具体的终端）
6、每条明细数量区间  2 ~ 30 （可配置）避免生成过多数据，每条明细数量可以适当加大 比如  15 ~ 60,最少15件，最大60件
7、终端数量分配区间 25/30 ~ 25/2  根据每条明细的最小及最大数量
8、生成任务  比如  数量 30，  根据最少分配终端数量及每单数量区间随机生成，如：[2,5,7,8,8] 、 [5,9,10,6],  等，  可以生多种组合， [ ] 数组内的（长度）既数字个数 表示 要分配的终端数量，数字之和表示 当天出库总量，如[2,5,7,8,8]表示要分配到5个终端，数量分别为2，5，7，8，8，数字大小表示 出库数量。
9、同一商品同一终端拿货间隔至少  x 天（可配置）
10、根据生成的任务分配终端，（如果有指定现饮或者非现饮的则在对应类型的终端中查找）

比如生成的例子 [2,5,7,8,8] 表示在随机 5 个符合条件的终端，并给予 相应的数量，形成当天任务。




        </pre>
      </div>
    </div>
  </tiny-dialog-box>
</template>

<script setup>
import {ref, onMounted} from "vue";
import {TinyDialogBox} from "@opentiny/vue";
import tool from "@/utils/tool";
import {useRoute} from "vue-router";
const route = useRoute()
const showHelp = ref(false)
const show = ref(false)
const showSet = ref(false)
const columns = ref([
  {type: 'index', width: 50},
  {title: '状态', width: 100,field:'stat', align: 'center'},
  {title: '日期', width: 100,field:'ym', align: 'center'},
  {title: '票号', width: 150,field:'billNo', align: 'center'},
  {title: '商品编码', width: 160,field:'invCode', align: 'center'},
  {title: '商品名称', field:'invName', align: 'left', headerAlign: 'center'},
  {title: '终端类型', width: 90,field:'terType', align: 'center'},
  {title: '终端编码', width: 110,field:'buCode', align: 'center'},
  {title: '终端名称', field:'buName', align: 'left', headerAlign: 'center'},
  {title: '数量', width: 100,field:'qty', align: 'right', sum: true,fixed: 'right'},
])
const list = ref([])
const jgridRef = ref(null)
const username = ref('')
const task = ref('')
const logList = ref([])
const infoMsg = ref('')
const tempUuid = ref('')
const updateLog = (str) => {
  logList.value.unshift(str)
  if(typeof str === 'object') {
    if(JSON.stringify(str).indexOf('结束出库') !== -1)
    getList()
  }
}
const startTask =  () => {
  let isLogend = true
  if(logList.value.length > 0) {
    isLogend = false
    for (let i = 0; i < logList.value.length; i++) {
      if(logList.value[i].msg.indexOf('任务结束') !== -1) {
        isLogend = true
        break
      }
    }
  }
  if(!isLogend) {
    return tool.err('请先等待任务结束')
  }
  logList.value = []
  tool.confirm('是否要启动任务！').then(() => {
    if(list.value.length > 999) {
      return tool.err('数量太多')
    }
    if(tempUuid.value) {
      tool.post('app/py', {
        which:'saveTodayTask', usernameAss: username.value,tempUuid: tempUuid.value
      }, true).then(ret => {
        if(ret.stat) {
          startPythonTask('')
        }
      })
    }
    else {
      startPythonTask('')
    }
  })
}
const startSign = () => {
  startPythonTask('justSign')
}
const startPythonTask = (kind = '') => {
  if(typeof qt !== 'undefined') {
    new QWebChannel(qt.webChannelTransport, function (channel) {
      // 获取 Python 中注册的对象
      window.bridge = channel.objects.bridge;
      let send = {
        name: "startTask",
        kind
      }
      window.bridge.send_message(JSON.stringify(send), function (response) {

      })
    });
  }
}
const getSets = () => {
  if(typeof qt !== 'undefined') {
    new QWebChannel(qt.webChannelTransport, function (channel) {
      // 获取 Python 中注册的对象
      window.bridge = channel.objects.bridge;
      let send = {
        name: "getSets"
      }
      window.bridge.send_message(JSON.stringify(send), function (response) {
        task.value = response
      })
    })
  }
}
const model = ref({
  dayMin: 0.8,
  dayMax: 1.2,
  dayTer: 15,
  billMin: 2,
  billMax: 30,
  gutDays: 2
})
onMounted(() => {
  username.value = route.query.username
  getSets()
  getList()
  window.updateLog = updateLog
})
const getList = () => {
  tool.post('app/py', {which:'getTodayTask', usernameAss: username.value}, true).then(ret => {
    list.value = ret.data.res
    tempUuid.value = ret.data.uuid
    jgridRef.value.setData(list.value)
    let gp = tool.xe.groupBy(list.value, 'buCode')
    let a = 0
    for(let it in gp) {
      a = a+1
    }
    if(a === 0) {
      infoMsg.value = ''
    }
    else {
      infoMsg.value = '产生明细 ' + list.value.length +' 条，同一终端汇总后单据 '+a+' 条'
    }
  })
}
const getBillSets = () => {
  tool.post('app/py', {which:'getBillSets', usernameAss: username.value}, true).then(ret => {
    if(ret.stat) {
      if(ret.data) {
        let res = JSON.parse(ret.data.sets)
        for(let it in res) {
          model.value[it] = res[it]
        }

      }
      showSet.value = true
    }
  })
}

const set = () => {
  getBillSets()
  //
}

const saveSets = () => {
  tool.post('app/py', {which:'saveBillSets', usernameAss: username.value,formData: model.value}, true).then(ret => {
    if(ret.stat) {
      showSet.value = false
    }
  })
}
const changeList = () => {
   getList()
}
defineExpose({changeList})
</script>
<style scoped lang="scss">
.sets {
  td{
    padding: 5px;
  }
}
.suc{
  color: green;
}
.err{
  color: red;
}
</style>